package com.ddxz.middleground.master.mapper;

import com.ddxz.middleground.master.entity.DepartmentEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * interface description
 *
 * @author 朱宗刚
 * @version 1.0.0
 * @date 2020/7/26
 */

@Mapper
@Repository
public interface DepartmentMapper {
    /**
     * 获取部门详情
     *
     * @param deptId 部门标识
     * @param tenant 租户信息
     * @return 部门详情
     */
    DepartmentEntity getDetail(@Param("deptId") String deptId,
                               @Param("tenant") String tenant);

    /**
     * 修改部门信息
     *
     * @param entity 部门信息
     * @param tenant 租户信息
     * @return 是否修改成功
     */
    Integer modifyDept(@Param("entity") DepartmentEntity entity,
                       @Param("tenant") String tenant);

    /**
     * 统计同一个部门下指定名称或编码出现的次数
     *
     * @param name     部门名称
     * @param code     部门编码
     * @param parentId 上级部门标识
     * @param tenant   租户信息
     * @return 次数
     */
    Integer getNumByName(@Param("name") String name,
                         @Param("code") String code,
                         @Param("pid") String parentId,
                         @Param("tenant") String tenant);

    /**
     * 新增部门信息
     *
     * @param entity 部门信息
     * @param tenant 租户信息
     * @return 是否保存成功
     */
    Integer saveDept(@Param("entity") DepartmentEntity entity,
                     @Param("tenant") String tenant);

    /**
     * 统计子部门个数
     *
     * @param deptId 部门标识
     * @param tenant 租户信息
     * @return 指定部门下子部门的个数
     */
    Integer getSubNum(@Param("deptId") String deptId,
                      @Param("tenant") String tenant);

    /**
     * 删除指定的空白部门
     *
     * @param deptId 部门标识
     * @param tenant 租户信息
     * @return 是否删除成功
     */
    Integer removeDept(@Param("deptId") String deptId,
                       @Param("tenant") String tenant);

    /**
     * 根据序号修改序号值
     *
     * @param parentId 上级部门标识
     * @param oldOrder 旧序号
     * @param newOrder 新序号
     * @param tenant   租户信息
     * @return 是否修改成功
     */
    Integer updateOrderByOrder(@Param("pid") String parentId,
                               @Param("oldOrder") Integer oldOrder,
                               @Param("newOrder") Integer newOrder,
                               @Param("tenant") String tenant);

    /**
     * 根据标识修改序号值
     *
     * @param entity   部门信息
     * @param newOrder 新序号
     * @param tenant   租户信息
     * @return 是否修改成功
     */
    Integer updateOrderById(@Param("entity") DepartmentEntity entity,
                            @Param("order") Integer newOrder,
                            @Param("tenant") String tenant);

    /**
     * 批量修改指定部门下子部门的序号
     *
     * @param parentId 上级部门标识
     * @param order    起始序号
     * @param tenant   租户信息
     * @return 修改部门个数
     */
    Integer updateBatchOrder(@Param("pid") String parentId,
                             @Param("order") Integer order,
                             @Param("tenant") String tenant);

    /**
     * 获取上级部门标识
     *
     * @param deptId 部门标识
     * @param tenant 租户信息
     * @return 上级部门标识
     */
    String getParentId(@Param("deptId") String deptId,
                       @Param("tenant") String tenant);

    /**
     * 根据位置获取部门标识
     *
     * @param parentId 上级部门标识
     * @param order    位置序号
     * @param tenant   租户信息
     * @return 指定位置的部门信息
     */
    String getIdByOrder(@Param("pid") String parentId,
                        @Param("order") Integer order,
                        @Param("tenant") String tenant);

    /**
     * 获取所有的子部门
     *
     * @param deptId 部门标识
     * @param tenant 租户信息
     * @return 子部门信息
     */
    List<DepartmentEntity> getDeptByParent(@Param("deptId") String deptId,
                                           @Param("tenant") String tenant);
}
